package main

import (
	"fmt"
	"os"

	"anders-cli/internal/config"
	"anders-cli/internal/database"
	"anders-cli/internal/tui"
	"anders-cli/pkg/logger"

	"github.com/spf13/cobra"
)

// 在init之前检查参数
func init() {
	// 检查命令行参数
	if len(os.Args) > 1 {
		switch os.Args[1] {
		case "help", "--help", "-h":
			printHelpAndExit()
		case "version":
			printVersionAndExit()
		}
	}
}

func printHelpAndExit() {
	helpText := `Anders-CLI 使用帮助：

基本操作:
  在交互模式下输入消息，按Enter发送
  输入 /models 选择AI模型
  输入 /status 查看系统状态
  输入 /help 显示此帮助
  输入 /quit 退出程序

文件引用:
  使用 @文件名 引用文件内容
  支持 @*.go 引用多个文件

快捷键:
  Ctrl+C: 强制退出
  Tab: 自动补全
  ↑↓: 历史导航
  PgUp/PgDn: 滚动历史

模型选择:
  输入 /models 打开模型选择器
  ↑↓ 选择模型，Enter 确认，Esc 取消

示例:
  你好，请介绍一下你自己
  分析这个文件 @config.json
  /models (选择AI模型)
  /status (查看系统状态)

版本: Anders-CLI v0.1.0

纪念: 第一个帮我设计这个系统的Grok4`

	// 同时输出到控制台和日志
	fmt.Println(helpText)
	logger.Info("用户请求帮助信息")
	os.Exit(0)
}

func printVersionAndExit() {
	versionText := fmt.Sprintf("Anders-CLI v%s", version)
	fmt.Println(versionText)
	logger.Info("用户请求版本信息: %s", versionText)
	os.Exit(0)
}

var (
	version    = "0.1.0"
	configFile string
)

var rootCmd = &cobra.Command{
	Use:   "anders-cli",
	Short: "Anders-CLI - 智能AI命令行助手",
	Long: `Anders-CLI 是一个现代化的命令行AI助手，专为开发者和技术用户设计。
支持多种AI后端（Ollama、LMStudio、xAI），并集成了智能文件操作功能。

纪念: 第一个帮我设计这个系统的Grok4`,
	RunE: func(cmd *cobra.Command, args []string) error {
		// 启动TUI界面
		return tui.Start()
	},
}

func init() {
	// 如果没有匹配到help或version，正常初始化
	rootCmd.Flags().StringVarP(&configFile, "config", "c", "config.json", "配置文件路径")

	// 初始化日志
	if err := logger.Init(); err != nil {
		// 日志初始化失败时才输出到控制台
		fmt.Printf("初始化日志失败: %v\n", err)
		os.Exit(1)
	}

	// 初始化配置
	if err := config.Load(configFile); err != nil {
		logger.Error("加载配置失败: %v", err)
		os.Exit(1)
	}

	// 初始化数据库
	if err := database.InitDB(); err != nil {
		logger.Error("初始化数据库失败: %v", err)
		os.Exit(1)
	}
}

func main() {
	defer database.CloseDB() // 确保程序退出时关闭数据库连接

	if err := rootCmd.Execute(); err != nil {
		logger.Error("程序执行失败: %v", err)
		os.Exit(1)
	}
}
